/*
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *    2010 year
 *    Author: Michael Khromov aka MikeDM (Mike D'Morto)
 *    E-Mail: mikedmorto@gmail.com
 */

#include "mutester.h"
#include <QGridLayout>
#include <KConfigDialog>

#include <QDir>

Mutester::Mutester(QObject *parent, const QVariantList &args)
    : Plasma::Applet(parent, args){



    this->setMinimumSize(17,17);
    this->resize(128,128);
    connect(&this->timer,SIGNAL(timeout()),SLOT(slotTik()));
    connect(&this->runner,SIGNAL(sigErrorGet()),SLOT(slotRunnerErrorGet()));
    connect(&this->runner,SIGNAL(sigErrorPut()),SLOT(slotRunnerErrorPut()));
    connect(&this->runner,SIGNAL(sigSuccessGet()),SLOT(slotRunnerSuccessGet()));
    connect(&this->runner,SIGNAL(sigSuccessPut()),SLOT(slotRunnerSuccessPut()));

    connect(&this->ris,SIGNAL(sigFinish()),SLOT(slotPostPaint()));
}

Mutester::~Mutester(){
    if (hasFailedToLaunch()) {
        // Clear on error launch
    } else {
        // Save data
        this->saveConfig();
    }
}

void Mutester::init(){
    this->cfg = new Muconfig;
    conf = config();
    //load config
    this->cfg->name=conf.readEntry("name","Change my");
    this->cfg->get=conf.readEntry("get","");
    this->cfg->put=conf.readEntry("put","");
    QString interval=conf.readEntry("timer","60");
    this->cfg->timer=interval.toInt();
    QString eiget=conf.readEntry("eintervalget","20");
    this->cfg->eiget=eiget.toInt();
    QString eiput=conf.readEntry("eintervalput","20");
    this->cfg->eiput=eiput.toInt();
    this->cfg->currentPlugin=conf.readEntry("currentPlugin","");
    // init fn - load config
    this->loadPlugins();

    this->timer.start(this->cfg->timer*1000);

}

void Mutester::paintInterface(QPainter *p,
                              const QStyleOptionGraphicsItem *option,
                              const QRect &contentsRect){

    p->setRenderHint(QPainter::SmoothPixmapTransform);
    p->setRenderHint(QPainter::Antialiasing);

    this->ris.startDefault(p,contentsRect);
    p->save();
    p->restore();

}


void Mutester::createConfigurationInterface(KConfigDialog *parent){
    //this->timer.stop();
    this->diacfg = new Mconfig(this->cfg,&this->pluglist,parent);
    connect(parent,SIGNAL(okClicked()),SLOT(slotConfigAccepted()));
    parent->addPage(this->diacfg, i18n("General"), "preferences-other");


}

void Mutester::slotConfigAccepted(){
    // get fresh cfg data from dialog
    qDebug()<<"slot config ACCEPT";
    this->diacfg->getConfig(this->cfg);
    this->diacfg->~Mconfig();

    this->saveConfig();
    if(!this->runner.isRunning()){
        this->timer.start(this->cfg->timer*1000);
    }
}

void Mutester::saveConfig(){
    // save config
    conf.writeEntry("name",this->cfg->name);
    conf.writeEntry("get",this->cfg->get);
    conf.writeEntry("put",this->cfg->put);
    conf.writeEntry("timer",this->cfg->timer);
    conf.writeEntry("eintervalget",this->cfg->eiget);
    conf.writeEntry("eintervalput",this->cfg->eiput);
    conf.writeEntry("currentPlugin",this->cfg->currentPlugin);

}

void Mutester::slotTik(){
    qDebug()<<"Timer tik";
    this->timer.stop();

    this->runner.startget(cfg->get,cfg->eiget);

}


void Mutester::slotRunnerErrorGet(){

    qDebug()<<"RUNNER ERROR GET";
    // call paint error get if need
    this->preparePaint(true);
}

void Mutester::slotRunnerErrorPut(){
    qDebug()<<"RUNNER ERROR PUT";

}

void Mutester::slotRunnerSuccessGet(){

        qDebug()<<"DATA <"<<this->runner.ret;

    // call paint
    this->preparePaint(false);

}

void Mutester::slotRunnerSuccessPut(){


}

void Mutester::preparePaint(bool err){
    // предварительная обработка данных для отрисовки
    qDebug()<<err<<"Prepare paint ---==   ^__^  ==--- ";
    // вызываем отрисовку
    //-this->teste=true;
    this->ris.setData(this->cfg->name,this->runner.ret);
    if(cfg->plid>=0){
        qDebug()<<"Cerrent plugin name "<<pluglist.at(cfg->plid)->getPluginName();
    }else{
        qDebug()<<"Cerrent plugin name NONE";
    }
    this->update();
    this->runner.startput(cfg->put+" \""+cfg->name+"\" \""+this->runner.ret+"\"",cfg->eiput);
    this->timer.start(this->cfg->timer*1000);

}

void Mutester::slotPostPaint(){
    //this->update();
    // запускаем нотификацию
    // call notifer
    //-if(teste){

        // запускаем таймер снова, ибо нотификация не особо то и важна для цикла опроса

    //-    teste=false;
    //-}

}

void Mutester::loadPlugins(){
    qDebug()<<"start load plugins";
    qDebug()<<"Plugins dir ="<<PLUGINS_DIR;
    QDir aa;
#ifdef Q_OS_LINUX
    aa.setNameFilters(QStringList("mutester_plugin_*.so"));
#endif
    aa.cd(PLUGINS_DIR);
    QStringList founded_plugins(aa.entryList());
    qDebug()<<founded_plugins;
    int realpl=-1; // идентификатор дествительного количества загруженых плагинов
    for(int i = 0; i < founded_plugins.size() ; i++){
        qDebug()<<founded_plugins.at(i);
        QPluginLoader ldr;
        qDebug()<<"start load"<<founded_plugins.at(i);
        ldr.setFileName(QString(PLUGINS_DIR)+"/"+founded_plugins.at(i));
        ldr.load();
        qDebug()<<"test load"<<founded_plugins.at(i)<<" = "<<ldr.isLoaded();
        if(ldr.isLoaded()){
            realpl++;
            MutesterPluginInterface * in = qobject_cast<MutesterPluginInterface*>(ldr.instance());
            pluglist.append(in);
            QString plname=in->getPluginName();
            if(in->getPluginName() == cfg->currentPlugin){
                // проверяем соответствие сохраненного имени плагина и загруженного,
                qDebug()<<"+++++++++++++++++++++++++++++++++++++++++++++";
                cfg->plid=realpl;
                qDebug()<<cfg->plid<<realpl;
            }
            qDebug()<<"GetPluginName <"+in->getPluginName()+">";
            qDebug()<<"plname <"+plname+">";
            // поднимаем конфиг для этого плагина.
            // вынимаем список всех опций для этого плагина, они хранятся одной строкой.
            QString plugstr=this->conf.readEntry(QString("pl_ops_")+plname,"");
            if(!plugstr.isEmpty()){
                QStringList plops=plugstr.split(",");
                qDebug()<<plops.size()<<plops;
                QMap<QString,QString> plmap;
                // вынимаем все опции из конфига в мап
                for(int i = 0; i < plops.size(); i ++){
                    plmap.insert(plops.at(i),conf.readEntry("pl_"+plname+"_"+plops.at(i)));
                    qDebug()<<"pl_"+plname+"_"+plops.at(i)
                            <<conf.readEntry("pl_"+plname+"_"+plops.at(i));
                }
                // отправляем мэп в плагин, пущай он там уже разбирается его это опции или не его.
                in->setCfg(&plmap);
                qDebug()<<"MAP SIZE"<<plmap.size();
            }
        }
    }
    //qDebug()<<"Post del ldr name "<<pluglist.at(0)->getPluginName();
    qDebug()<<"stop load plugins";
    qDebug()<<"current plugin id="<<cfg->plid;

}

#include "mutester.moc"

